home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 09 / 2 / window-machine / wm_source.ampk / WM_Screen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.9 KB  |  376 lines

  1. #include <WM.h>
  2. #include <MyStructs.h>
  3. #include <IText.h>
  4. #include <Screen.h>
  5.  
  6. VOID TestSok()
  7. {
  8.     if(Sok==0)
  9.     {
  10.         ClearMenuStrip(WMwin);
  11.         WMItem16.Flags=ItemOnC;
  12.         WMItem14.Flags=ItemOnC;
  13.         WMItem12.Flags=ItemOnC;
  14.         WMItem11a.Flags=ItemOnC;
  15.         SetMenuStrip(WMwin,&WMMenu6);
  16.         Sok++;
  17.     }
  18. }
  19. USHORT NewSc()
  20. {
  21.     if(asc=(struct MyScreen *)AllocMem(sizeof(struct MyScreen),MEMF_CLEAR|MEMF_PUBLIC))
  22.     {
  23.         if(firstS==NULL) firstS=asc;
  24.         asc->Parent=lastS;
  25.         if(lastS) lastS->NextScreen=asc;
  26.         asc->Width=640;
  27.         asc->Height=WMsc->Height;
  28.         asc->Depth=2;
  29.         asc->BlockPen=1;
  30.         asc->ViewModes=HIRES;
  31.         asc->Type=WBENCHSCREEN;
  32.         asc->Font=f2;
  33.         asc->Colors=4;
  34.         if(!(asc->sc=(struct Screen *)NScreen()))
  35.         {
  36.             FreeMem(asc,sizeof(struct MyScreen));
  37.             if(asc==firstS)
  38.             {
  39.                 firstS=NULL;
  40.                 asc=NULL;
  41.             }
  42.             else
  43.             {
  44.                 lastS=asc->Parent;
  45.                 asc=lastS;
  46.                 asc->NextScreen=NULL;
  47.                 sc=asc->sc;
  48.                 nosc=asc;
  49.             }
  50.             return(1);
  51.         }
  52.         sc=asc->sc;
  53.         lastS=asc;
  54.         nosc=asc;
  55.         firstW=NULL;
  56.         lastW=NULL;
  57.         if(NewWin(0)) return(1);
  58.         asc->FirstWindow=awin;
  59.         firstW=awin;
  60.         lastW=awin;
  61.         TestSok();
  62.         GadOff();
  63.         for(i=0; i<32; i++)
  64.             asc->ColorMap[i]=STDColors[i];
  65.         GetColors();
  66.         return(0);
  67.     }
  68.     return(1);
  69. }
  70. VOID GetColors()
  71. {
  72.     vp=&sc->ViewPort;
  73.     LoadRGB4(vp,&asc->ColorMap[0],asc->Colors);
  74. }
  75. NScreen()
  76. {
  77.     struct NewScreen AScreen;
  78.     
  79.     AScreen.LeftEdge=asc->LeftEdge;
  80.     AScreen.TopEdge=asc->TopEdge;
  81.     AScreen.Width=asc->Width;
  82.     AScreen.Height=asc->Height;
  83.     AScreen.Depth=asc->Depth;
  84.     AScreen.DetailPen=asc->DetailPen;
  85.     AScreen.BlockPen=asc->BlockPen;
  86.     AScreen.ViewModes=asc->ViewModes & 0xFBFF;
  87.     AScreen.Type=asc->Type & 0xFF3F;
  88.     AScreen.Font=NULL;
  89.     if(asc->Font==1) AScreen.Font=&ZS8;
  90.     if(asc->Font==2) AScreen.Font=&ZS9;
  91.     AScreen.DefaultTitle=NULL;
  92.     if(strlen(asc->Title)>0) AScreen.DefaultTitle=asc->Title;
  93.     AScreen.Gadgets=NULL;
  94.     AScreen.CustomBitMap=NULL;
  95.     return((struct Screen *)OpenScreen(&AScreen));
  96. }
  97.  
  98. VOID SetSDefines()
  99. {
  100.     Wdetail=asc->DetailPen;
  101.     sprintf(DETAILBuff,"%d",Wdetail);
  102.     Wblock=asc->BlockPen;
  103.     sprintf(BLOCKBuff,"%d",Wblock);
  104.     Wleft=asc->LeftEdge;
  105.     sprintf(LEFTBuff,"%d",Wleft);
  106.     Wtop=asc->TopEdge;
  107.     sprintf(TOPBuff,"%d",Wtop);
  108.     Wwidth=asc->Width;
  109.     sprintf(WIDTHBuff,"%d",Wwidth);
  110.     Wheight=asc->Height;
  111.     sprintf(HEIGHTBuff,"%d",Wheight);
  112.     Wdepth=asc->Depth;
  113.     sprintf(DEPTHBuff,"%d",Wdepth);
  114.     TITLEInfo.DispPos=0;
  115.     strcpy(TITLEBuff,asc->Title);
  116.     strcpy(GNAMEBuff,asc->Name);
  117.     strcpy(BPOINTERBuff,asc->BitMap);
  118.     strcpy(GPOINTERBuff,asc->Gadgets);
  119.     f2=asc->Font;
  120.     TxS=8;
  121.     if(f2==2) TxS=10;
  122.     SText[12].IText=FONT[f2];
  123.     Wtype=asc->Type;
  124.     for(i=2; i<5; i++)
  125.     {
  126.         SFGad[i].Flags=NULL;
  127.         if(Wtype & SFLAGS[i])
  128.             SFGad[i].Flags=SELECTED;
  129.     }
  130.     Wview=asc->ViewModes;
  131.     for(i=0; i<7; i++)
  132.     {
  133.         SVGad[i].Flags=NULL;
  134.         if(Wview & SVIEWS[i])
  135.             SVGad[i].Flags=SELECTED;
  136.     }
  137. }
  138.  
  139. USHORT NewScDef()
  140. {
  141.     USHORT quit=1;
  142.     if(asc==NULL)
  143.     {
  144.         asc=firstS;
  145.         firstW=asc->FirstWindow;
  146.         awin=firstW;
  147.         lastW=firstW;
  148.         while(awin)
  149.         {
  150.             lastW=awin;
  151.             awin=awin->NextWindow;
  152.         }
  153.         awin=lastW;
  154.         nosc=asc;
  155.     }
  156.     ScreenToFront(WMsc);
  157.     SetSDefines();
  158.     SWindow.Screen=WMsc;
  159.     if(!(Wwin=(struct Window *)OpenWindow(&SWindow))) return(1);
  160.     Wrp=Wwin->RPort;
  161.     WinBorder(Wwin);
  162.     PrintIText(Wrp,&SText[27],0,0);
  163.     if((asc->Type & 0x000q) == 1) Box(21,39,21,8,119,&SFGad[1]);
  164.     if((asc->Type & 0x000F) == 15) Box(21,39,32,8,119,&SFGad[1]);
  165.  
  166.     do
  167.     {
  168.         Wait(1L << Wwin->UserPort->mp_SigBit);
  169.         GetMessage(Wwin);
  170.         switch(class)
  171.         {
  172.             case GADGETUP:
  173.             switch(Id)
  174.             {
  175.                 /* EXIT */
  176.                 case 0: quit=0;
  177.                     break;
  178.                 /* OK */
  179.                 case 1: quit=2;
  180.                     if(Wdepth==0) Wdepth++;
  181.                     if(Wdepth > 4 && (Wview & HIRES))
  182.                         Wdepth=4;
  183.                     if(Wdepth > 5)
  184.                     {
  185.                         if((Wview & HAM)==0 && 
  186.                         (Wview & EXTRA_HALFBRITE)==0)
  187.                             Wdepth=5;
  188.                     }
  189.                     asc->Depth=Wdepth;
  190.                     asc->Colors=1 << Wdepth;
  191.                     if(asc->Colors==64) asc->Colors=32;
  192.                     asc->BlockPen=Wblock;
  193.                     asc->DetailPen=Wdetail;
  194.                     if(Wview & HAM)
  195.                     {
  196.                         if(Wheight > 256)
  197.                             Wheight=256;
  198.                         if(Wview & LACE)
  199.                             Wview ^= LACE;
  200.                     }
  201.                     asc->Height=Wheight;
  202.                     asc->Width=Wwidth;
  203.                     asc->TopEdge=Wtop;
  204.                     asc->LeftEdge=Wleft;
  205.                     asc->Font=f2;
  206.                     strcpy(asc->Title,TITLEBuff);
  207.                     strcpy(asc->Gadgets,GPOINTERBuff);
  208.                     strcpy(asc->BitMap,BPOINTERBuff);
  209.                     asc->Type=Wtype;
  210.                     strcpy(asc->Name,GNAMEBuff);
  211.                     asc->ViewModes=Wview;
  212.                     break;
  213.                 
  214.                 /* Depth */
  215.                 case 4: Wdepth=DEPTHInfo.LongInt;
  216.                     break;
  217.                 /* BlockPen */
  218.                 case 5: Wblock=BLOCKInfo.LongInt;
  219.                     break;
  220.                 /* DetailPen */
  221.                 case 6: Wdetail=DETAILInfo.LongInt;
  222.                     break;
  223.                 /* Height */
  224.                 case 7: Wheight=HEIGHTInfo.LongInt;
  225.                     break;
  226.                 /* Width */
  227.                 case 8: Wwidth=WIDTHInfo.LongInt;
  228.                     break;
  229.                 /* TopEdge */
  230.                 case 9: Wtop=TOPInfo.LongInt;
  231.                     break;
  232.                 /* LeftEdge */
  233.                 case 10: Wleft=LEFTInfo.LongInt;
  234.                     break;
  235.                 /* Title */
  236.                 case 11: break;
  237.                 /* Name */
  238.                 case 26: break;
  239.                 /* Gadget-Pointer */
  240.                 case 12: break;
  241.                 /* BitMap-Pointer */
  242.                 case 13: break;
  243.                 /* CLOSE */
  244.                 case 2: if(Error(6,0,0)==0) break;
  245.                     if(asc->Parent)
  246.                     {
  247.                         asc->Parent->NextScreen=asc->NextScreen;
  248.                         if(asc->NextScreen)
  249.                         {
  250.                             asc->NextScreen->Parent=asc->Parent;
  251.                             helpS=asc->NextScreen;
  252.                         }
  253.                         else
  254.                         {
  255.                             helpS=asc->Parent;
  256.                             lastS=helpS;
  257.                         }
  258.                     }
  259.                     else
  260.                     {
  261.                         if(asc->NextScreen)
  262.                         {
  263.                             firstS=asc->NextScreen;
  264.                             firstS->Parent=NULL;
  265.                             helpS=firstS;
  266.                         }
  267.                         else
  268.                         {
  269.                             Sok=0;
  270.                             nosc=NULL;
  271.                             lastS=NULL;
  272.                             firstS=NULL;
  273.                             helpS=NULL;
  274.                             sc=WMsc;
  275.                         }
  276.                     }
  277.                     CloseAwinAll(asc->FirstWindow);
  278.                     CloseScreen(asc->sc);
  279.                     FreeMem(asc,sizeof(struct MyScreen));
  280.                     asc=helpS;
  281.                     quit=0;
  282.                     if(asc)
  283.                     {
  284.                         sc=asc->sc;
  285.                         firstW=asc->FirstWindow;
  286.                         WFolge();
  287.                         awin=helpW;
  288.                     }
  289.                     else
  290.                     {
  291.                         if(noscW)
  292.                         {
  293.                             firstW=noscW;
  294.                             WFolge();
  295.                             awin=helpW;
  296.                         }
  297.                     }
  298.                     break;
  299.             } /* switch Id */
  300.             break;
  301.             
  302.             case GADGETDOWN:
  303.             /* FONT */
  304.             if(Id==3)
  305.             {
  306.                 if(++f2 == 3) f2=0;
  307.                 SText[12].IText=FONT[f2];
  308.                 RefreshGList(&SFONT,Wwin,NULL,1);
  309.                 TxS=8;
  310.                 if(f2==2) TxS=10;
  311.                 break;
  312.             }
  313.             if(Id==14)
  314.             {
  315.                 Wtype &= 0xFFF0;
  316.                 Box(21,39,21,8,119,&SFGad[1]);
  317.             }
  318.             else if(Id==15)
  319.             {
  320.                 Wtype &= 0xFFF0;
  321.                 Box(21,39,32,8,119,&SFGad[1]);
  322.             }
  323.             if(Id > 13 && Id < 19)
  324.                 Wtype ^= SFLAGS[Id-14];
  325.             if(Id > 18 && Id < 26)
  326.                 Wview ^= SVIEWS[Id-19];
  327.             break;
  328.         } /* switch class */
  329.     } while(quit==1); /* do */
  330.     CloseWindow(Wwin);
  331.     Work();
  332.     MenuOff();
  333.     SaveOk=0;
  334.     if(quit==2)
  335.     {
  336.         CloseAwin(asc->FirstWindow);
  337.         CloseScreen(asc->sc);
  338.         sc=(struct Screen *)NScreen();
  339.         asc->sc=sc;
  340.         GetColors();
  341.         awin=asc->FirstWindow;
  342.         firstW=awin;
  343.         lastW=awin;
  344.         while(awin)
  345.         {
  346.             lastW=awin;
  347.             awin->Screen=sc;
  348.             awin->win=NULL;
  349.             SetNewWin(1);
  350.             awin=awin->NextWindow;
  351.         }
  352.         awin=lastW;
  353.         SaveOk=1;
  354.     }
  355.     if(awin)
  356.     {
  357.         SetNewWin(0);
  358.         SaveOk=1;
  359.     }
  360.     ScreenToFront(sc);
  361.     Ready();
  362.     return(0);
  363. }
  364.  
  365. VOID WFolge()
  366. {
  367.     lastW=firstW;
  368.     helpW=firstW;
  369.     while(helpW)
  370.     {
  371.         lastW=helpW;
  372.         helpW=helpW->NextWindow;
  373.     }
  374.     helpW=lastW;
  375. }
  376.